package anaydis.sort;

import com.sun.istack.internal.NotNull;

import java.util.Comparator;
import java.util.List;

/**
 * Analisis y Diseno de Algoritmos - Practica 2011
 *
 * Basic Interface for all {@link anaydis.sort.Sorter sorters}.
 * Todas las implentaciones de los distintos Sorter
 * deber�n implementar {@link anaydis.sort.Sorter}.
 * Implementaciones t�picas:
 * <ul>
 *   <li>BubbleSorter</li>
 *   <li>InsertionSorter</li>
 *   <li>SelectionSorter</li>
 *   <li>MergeSorter</li>
 *   <li>QuickSorter</li>
 *   <li>ShellSorter</li>
 *   <li>HSorter</li>
 * </ul>
 * La clase AbstractSorter deber� ser abstracta e implementar
 * Sorter. De ah� extender�n todas las implementaciones
 * anteriormente mencionadas.
 */
public interface Sorter
{
    /**
     * Sorts the specified list into ascending order, according to the
     * natural ordering of its elements.
     * @param comparator to be used for sorting
     * @param list to be sorted.
     */
    <T> void sort(@NotNull final Comparator<T> comparator, @NotNull final List<T> list);

    /**
     * Returns the {@link SorterType type}
     * @return Sorter's type.
     */
    @NotNull SorterType getType();
}
